/*
 * Copyright (c) 2022 Winner Microelectronics Co., Ltd. All rights reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
 
#ifndef WM_NETIF2_0_3_H
#define WM_NETIF2_0_3_H

#include "wm_config.h"
#include "wm_type_def.h"
#include "wm_sockets.h"
#include "wm_wifi.h"
#include "wm_params.h"

/** MACRO for callback EVENT to join AP or create soft-AP successfully  */
#define    NETIF_WIFI_JOIN_SUCCESS         0x1
/** MACRO for callback EVENT to fail to join AP */
#define    NETIF_WIFI_JOIN_FAILED          0x2
/** MACRO for callback EVENT to disconnect from AP or destroy soft-AP */
#define    NETIF_WIFI_DISCONNECTED         0x3
/** MACRO for callbck EVENT to get IP address */
#define    NETIF_IP_NET_UP                 0x4
/** MACRO for callback EVNET to create AP successfully */
#define    NETIF_WIFI_SOFTAP_SUCCESS       0x5
/** MACRO for callback EVNET to create soft-AP failed */
#define    NETIF_WIFI_SOFTAP_FAILED        0x6
/** MACRO for callback EVNET to close soft-AP */
#define    NETIF_WIFI_SOFTAP_CLOSED        0x7
/** MACRO for callback EVNET to inform soft ap's net */
#define    NETIF_IP_NET2_UP                0x8

#define    NETIF_IPV6_NET_UP               0x9

/** These are the values for ip_addr_t.type */
#define    IPADDR_TYPE_V4                  0U
#define    IPADDR_TYPE_V6                  6U
#define    IPADDR_TYPE_ANY                 46U

#define     IPV6_ADDR_MAX_NUM              3

struct tls_ethif {
    ip_addr_t ip_addr;
    ip_addr_t netmask;
    ip_addr_t gw;
#if TLS_CONFIG_IPV6
    ip_addr_t ip6_addr[IPV6_ADDR_MAX_NUM];
#endif
    ip_addr_t dns1;
    ip_addr_t dns2;
    u8 status;              /* 0:net down; 1:net up */
#if TLS_CONFIG_IPV6
    u8 ipv6_status[IPV6_ADDR_MAX_NUM];    /* 0:net down; 1:net up */
#endif
};

 /* type defination of netif status changed callback. */
typedef void (*tls_netif_status_event_fn)(u8 status);

/**
 * @defgroup APP_APIs APP APIs
 * @brief APP APIs
 */

/**
 * @addtogroup APP_APIs
 * @{
 */

/**
 * @defgroup NETIF_APIs NETIF APIs
 * @brief network interface APIs
 */

/**
 * @addtogroup NETIF_APIs
 * @{
 */

/**
 * @brief          This function is used to initialize TCP/IP Stack
 *
 * @param[in]      None
 *
 * @retval         0     success
 * @retval         other failed
 *
 * @note           None
 */
int tls_ethernet_init(void);

/**
 * @brief          This function is used to get IP information stored in
                   tls_ethif struct
 *
 * @param[in]      None
 *
 * @retval         tls_ethif *     Pointer to struct tls_ethif
 *
 * @note           None
 */
struct tls_ethif *tls_netif_get_ethif(void);

/**
 * @brief          This function is used to set tls_ethif status
 *
 * @param[in]      status  net status, 0-up, 1-down
 *
 * @return         None
 *
 * @note           None
 */
void tls_netif_set_status(u8 status);

/**
 * @brief          This function is used to start DHCP Client
 *
 * @param[in]      None
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           None
 */
err_t tls_dhcp_start(void);

/**
 * @brief          This function is used to stop DHCP client
 *
 * @param[in]      None
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           None
 */
err_t tls_dhcp_stop(void);

/**
 * @brief          This function is used to change IP information
 *
 * @param[in]      *ipaddr     IP address
 * @param[in]      *netmask    netmask
 * @param[in]      *gw         default gateway
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           None
 */
err_t tls_netif_set_addr(ip_addr_t *ipaddr,
                         ip_addr_t *netmask,
                         ip_addr_t *gw);

/**
 * @brief          This function is used to set dns servers
 *
 * @param[in]      numdns     index of the DNS server to set
                               must be < DNS_MAX_SERVERS
 * @param[in]      *dnsserver IP address of the DNS server to set
 *
 * @return         None
 *
 * @note           None
 */
void tls_netif_dns_setserver(u8 numdns, ip_addr_t *dnsserver);

/**
 * @brief          This function is used to bring up an interface,available
                   for processing traffic
 *
 * @param[in]      None
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           None
 */
err_t tls_netif_set_up(void);

/**
 * @brief          This function is used to bring down an interface,disabling
                    any traffic processing
 *
 * @param[in]      None
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           None
 */
err_t tls_netif_set_down(void);

/**
 * @brief          This function is used to add netif status changed callback
                   to event list,if exists, do nothing
 *
 * @param[in]      event_fn    pointer to tls_netif_status_event_fn
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           None
 */
err_t tls_netif_add_status_event(tls_netif_status_event_fn event_fn);

/**
 * @brief          This function is used to remove netif status changed
                   callback function from event list,if not exists, do nothing
 *
 * @param[in]      event_fn    pointer to tls_netif_status_event_fn
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           None
 */
err_t tls_netif_remove_status_event(tls_netif_status_event_fn event_fn);

/**
 * @brief          This function is used to get pointer of netif
 *
 * @param[in]      None
 *
 * @retval         pointer of netif
 *
 * @note           None
 */
struct netif *tls_get_netif(void);

#if TLS_CONFIG_AP
/**
 * @brief          Start DHCP Server for a network interface
 * *
 * @retval         DHCPS_ERR_SUCCESS - No error
 * @retval         DHCPS_ERR_MEM - Out of memory
 * @retval         DHCPS_ERR_LINKDOWN - The NI is inactive
 *
 * @note           None
 */
INT8S tls_dhcps_start(void);

/**
 * @brief          This function is used to stop DHCP Server
 *
 * @param[in]      None
 *
 * @retval         None
 *
 * @note           None
 */
void tls_dhcps_stop(void);

/**
 * @brief          Start the dns server's service
 * *
 * @retval         DHCPS_ERR_SUCCESS - No error
 * @retval         DHCPS_ERR_MEM - Out of memory
 * @retval         DHCPS_ERR_LINKDOWN - The NI is inactive
 * @retval           DNSS_ERR_PARAM - Input parameter error
 *
 * @note           None
 */
INT8S tls_dnss_start(INT8U *DnsName);

/**
 * @brief          Stop the dns server's service
 *
 * @param[in]      None
 *
 * @retval         None
 *
 * @note           None
 */
void tls_dnss_stop(void);

/**
 * @brief          Get station's ip address by mac address
 *
 * @param[in]      mac    station's mac address
 *
 * @retval         ip_addr   station's ip address
 *
 * @note           None
 */
ip_addr_t *tls_dhcps_getip(const u8_t *mac);

/**
 * @brief          Get station's mac address by ip address
 *
 * @param[in]      ip    station's ip address
 *
 * @retval         u8*   station's mac address
 *
 * @note           None
 */
u8 *tls_dhcps_getmac(const ip_addr_t *ip);
#endif /* TLS_CONFIG_AP */

#if TLS_CONFIG_RMMS
/**
 * @brief          Start remote manager server.
 * *
 * @retval         DHCPS_ERR_SUCCESS - No error
 * @retval         DHCPS_ERR_MEM - Out of memory
 * @retval         DHCPS_ERR_LINKDOWN - The NIF is inactive
 *
 * @note           None
 */
INT8S tls_rmms_start(void);

/**
 * @brief          Disable remote manager server
 *
 * @param[in]      None
 *
 * @retval         None
 *
 * @note           None
 */
void tls_rmms_stop(void);
#endif

#if TLS_CONFIG_AP
/**
 * @brief          This is used to bring up an interface for APSTA,available
                   for processing traffic
 *
 * @param[in]      None
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           Can only be used at APSTA mode
 */
err_t tls_netif2_set_up(void);

/**
 * @brief          This function is used to bring down an interface for APSTA, disabling
                   any traffic processing
 *
 * @param[in]      None
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           Can only be used at APSTA mode
 */
err_t tls_netif2_set_down(void);

/**
 * @brief          This function is used to change IP information for
                   a network interface for APSTA
 *
 * @param[in]      *ipaddr     IP address
 * @param[in]      *netmask    netmask
 * @param[in]      *gw         default gateway
 *
 * @retval         0     success
 * @retval         Minus failed
 *
 * @note           Can only be used at APSTA mode
 */
err_t tls_netif2_set_addr(ip_addr_t *ipaddr,
    ip_addr_t *netmask, ip_addr_t *gw);

/***************************************************************************
* Function: tls_dhcps_setdns
* Description: Set dhcp server's dns address.
*
* Input:  numdns:     the index of the DNS server to set must be less than DNS_MAX_SERVERS
*
* Output: None
*
* Return: None
*
* Date : 2015-3-10
****************************************************************************/
/**
 * @brief          Set dhcp server's dns address
 *
 * @param[in]      numdns the index of the DNS server to set must be less than DNS_MAX_SERVERS
 *
 * @retval         None
 *
 * @note           Can only be used at APSTA mode
 */
void tls_dhcps_setdns(u8_t numdns);
#endif

/**
 * @}
 */

/**
 * @}
 */

#endif /* WM_NETIF_H */
